from abc import ABC, abstractmethod


# 1. 运行代码
# 输出如下：
# 用户 Alice 借阅了图书 B1001。
# 用户 Alice 归还了图书 B1001。
# 管理员 Bob 借阅了图书 B2002。
# 管理员 Bob 归还了图书 B2002。
# 管理员 Bob 添加了图书 B3003，书名: Python 编程。
# 管理员 Bob 删除了图书 B3003。

# 2. 指出该代码体现了哪个原则
# 体现了接口隔离原则（Interface Segregation Principle, ISP）

# 3. 请说明该代码是如何体现该原则
# 接口隔离原则指出，客户端不应该被迫依赖于它不使用的接口。换句话说，不应该强迫客户程序依赖那些它们用不到的方法。
# 在这个例子中：
# - `UserOperations` 接口定义了普通用户可以执行的操作（借书和还书）。
# - `AdminOperations` 接口定义了管理员可以执行的操作（添加和删除图书）。
# - `RegularUser` 类只实现了 `UserOperations` 接口，因为它只需要借书和还书的功能。
# - `Admin` 类实现了 `UserOperations` 和 `AdminOperations` 接口，因为它需要所有这些功能。
# - 这种设计避免了 `RegularUser` 类被迫实现它不需要的管理员操作，从而遵循了接口隔离原则。

# 定义用户操作的接口
class UserOperations(ABC):
    @abstractmethod
    def borrow_book(self, book_id):
        pass

    @abstractmethod
    def return_book(self, book_id):
        pass


# 定义管理员操作的接口
class AdminOperations(ABC):
    @abstractmethod
    def add_book(self, book_id, title):
        pass

    @abstractmethod
    def remove_book(self, book_id):
        pass


# 普通用户类，实现用户操作接口
class RegularUser(UserOperations):
    def __init__(self, user_id, name):
        self.user_id = user_id
        self.name = name

    def borrow_book(self, book_id):
        print(f"用户 {self.name} 借阅了图书 {book_id}。")

    def return_book(self, book_id):
        print(f"用户 {self.name} 归还了图书 {book_id}。")


# 管理员类，实现管理员操作接口和用户操作接口
class Admin(UserOperations, AdminOperations):
    def __init__(self, admin_id, name):
        self.admin_id = admin_id
        self.name = name

    # 用户操作
    def borrow_book(self, book_id):
        print(f"管理员 {self.name} 借阅了图书 {book_id}。")

    def return_book(self, book_id):
        print(f"管理员 {self.name} 归还了图书 {book_id}。")

    # 管理员操作
    def add_book(self, book_id, title):
        print(f"管理员 {self.name} 添加了图书 {book_id}，书名: {title}。")

    def remove_book(self, book_id):
        print(f"管理员 {self.name} 删除了图书 {book_id}。")


# 测试示例
if __name__ == "__main__":
    # 创建普通用户
    regular_user = RegularUser(user_id=101, name="Alice")

    # 创建管理员
    admin = Admin(admin_id=201, name="Bob")

    # 普通用户借书还书
    regular_user.borrow_book("B1001")
    regular_user.return_book("B1001")

    # 管理员借书还书
    admin.borrow_book("B2002")
    admin.return_book("B2002")

    # 管理员添加和删除图书
    admin.add_book("B3003", "Python 编程")
    admin.remove_book("B3003")